package com.xiamaliu;

// 这种形式兼顾饿汉式单例模式的内存浪费和synchronized的性能问题
// 完美地屏蔽了这两个缺点
public class LazyInnerClassSingleton {

    // 使用 LazyInnerClassSingleton 的时候，默认会先初始化内部类
    // 如果没有使用，则内部类不会被加载
    public LazyInnerClassSingleton() {
        // TODO 优化后
        if (LazyHolder.INSTANCE != null) {
            throw new RuntimeException("不允许创建多个实例");
        }
    }

    // 每一个关键字都不是多余的，static 是为了使单例的空间共享，保证这个方法不会被重写、重载
    public static LazyInnerClassSingleton getInstance() {
        // 在返回结果以前，一定会先加载内部类
        return LazyHolder.INSTANCE;
    }

    // 默认不加载
    private static class LazyHolder {
        private static final LazyInnerClassSingleton INSTANCE = new LazyInnerClassSingleton();
    }
}
